#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//(*(void(*)())0)()//将0，强制转化为函数指针，
////然后再调用0地址处的，函数的参数部分为无参，返回类型为void
//
//void (*signal(int,void(*)(int)))(int)
//void (*  )(int)
////利用函数指针调用一个singnal的函数
////该代码是一次函数的声明，声明的函数叫singnal
////singnal函数有两个参数，一个是int类，另一个是函数指针类型，该函数指针能够指向的那个函数的参数类型是int，函数的返回值为void
////singal函数的返回值是一个函数指针，该函数指针能够指向的那个函数的参数类型是int，返回值为void
//
//typedef void(*pf_t) int  //将void(*) int 函数指针类型重命名为pf_t
//pf_t singal(int ,pf_t)
//
//
//函数指针数组：存放函数指针的数组
//从函数指针演变而来
//int (*pf)(const char*)//函数指针
//int (*pf[5])(const char*)//函数指针数组
////[]先和pf结合是一个数组，把pf[5]拿掉
////剩下的部分就是数组元素的类型


//写一个计算器实现加，减，乘，除
//int Div(int x, int y)
//{
//	return x/y;
//}
//int Mul(int x, int y)
//{
//	return x*y;
//}
//int Sub(int x, int y)
//{
//	return x - y;
//}
//int Add(int x,int y)
//{
//	return x + y;
//}
//void menu()
//{
//	printf("*******************\n");
//	printf("***1.add 2.sub*****\n");
//	printf("***3.mul 4.div*****\n");
//	printf("***0.exit**********\n");
//}
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	do
//	{
//		menu();
//		printf("请选择上述操作\n");
//		scanf("%d",&input);
//		switch (input)
//		{
//		case 1:
//			printf("请输入两个数\n");
//			scanf("%d %d",&x,&y);
//			ret=Add(x, y);
//			printf("%d\n",ret);
//			break;
//		case 2:
//			printf("请输入两个数\n");
//			scanf("%d %d", &x, &y);
//			ret = Sub(x, y);
//			printf("%d\n", ret);
//			break;
//		case 3:
//			printf("请输入两个数\n");
//			scanf("%d %d", &x, &y);
//			ret = Mul(x, y);
//			printf("%d\n", ret);
//			break;
//		case 4:
//			printf("请输入两个数\n");
//			scanf("%d %d", &x, &y);
//			ret = Div(x, y);
//			printf("%d\n", ret);
//			break;
//		case 0:
//			printf("退出计算器");
//			break;
//		default:
//			printf("选择错误");
//			break;
//		}
//	} while (input);
//	return 0;
//}

int Div(int x, int y)
{
	return x / y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Add(int x, int y)
{
	return x + y;
}
void menu()
{
	printf("*******************\n");
	printf("***1.add 2.sub*****\n");
	printf("***3.mul 4.div*****\n");
	printf("***0.exit**********\n");
}
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	//定义一个函数指针数组
	int (*pf[5])(int, int) = {0,Add,Sub,Mul,Div};
	do
	{
		menu();
		printf("请选择上述操作\n");
		scanf("%d", &input);
		if (input==0)
		{
			printf("退出计算器");
			break;
		}
		else if (input >= 1 && input <= 4)
		{
			//对数组元素进行引用
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = pf[input](x, y);
			printf("%d\n", ret);
		}
		else
		{
			printf("输入错误\n");
		}
	} while (input);
	return 0;
}